#ifndef _TERRAIN_H_
#define _TERRAIN_H_

/** @brief File brief description
 * Le module Terrain permet la gestion d'un terrain*/


/** @brief Le premier champ de la structure terrain est un entier indiquant si le terrain est 
 * deverrouille ou non,un terrain est deverouille si le joueur a complete le terrain 
 * precedant.Les champs suivants sont les dimensions du terrain (2 entiers), un entier
 * indiquant si le terrain est un terrain bonus qui peut etre gagne par le joueur 
 * sous certaines conditions (par achat par exemple), le cout du terrain (entier)*/
typedef struct 
{	
	int deverouille_terrain;
	int dimX_terrain;
	int dimY_terrain;
	int est_bonus_terrain;
	int cout_terrain;
	
}Terrain;


/** @brief Cette procédure initialise un Terrain, en saisissant tout ses champs
 * @param [in,out] pterrain
 * @param [in] deverouille
 * @param [in] dimX_ter
 * @param [in] dimY_ter
 * @param [in] est_bonus_ter
 * @param [in] cout_ter*/
void initTerrain (Terrain* pterrain, const int deverouille, const int dimX_ter, 
const int dimY_ter, const int est_bonus_ter, const int cout_ter);

/** @brief Cette fonction reserve dans le tas l'espace necessaire pour un terrain,
 * l'initialise et retourne un pointeur sur le terrain cree
 * @param [in] deverouille
 * @param [in] dimX_ter
 * @param [in] dimY_ter
 * @param [in] est_bonus_ter
 * @param [in] cout_ter
 * @return pterrain*/
Terrain* creerTerrain (const int deverouille, const int dimX_ter, 
const int dimY_ter, const int est_bonus_ter, const int cout_ter);

/** @brief Cette procedure libere l'espace memoire alloue dans le tas pour un terrain
 *  @param [in,out] ppterrain*/
void detruireTerrain (Terrain** ppterrain);

/** @brief Cette fonction renvoie un entier qui determine si le terrain passé en parametre est everouillé ou non
 * @param [in] pterrain
 * @return pterrain->deverouille_terrain*/
const int getDeverouilleTerrain (const Terrain* pterrain);

/** @brief Cette procédure permet de changer si le terrain passé en parametre est deverouillé ou non pas dev_ter
 * @param [in,out] pterrain
 * @param [in] dev_ter*/
void setDeverouilleTerrain (Terrain* pterrain, const int dev_ter);

/** @brief Cette fonction renvoie un entier qui correpsond à la largeur du terrain passé en parametre
 * @param [in]
 * @return pterrain->dimX_terrain*/
const int getDimX_terrain (const Terrain* pterrain);

/** @brief Cette procédure permet de changer la largeur du terrain passé en parametre par dimX_ter
 * @param [in,out] pterrain
 * @param [in] dimX_ter*/
void setDimX_terrain (Terrain* pterrain, const int dimX_ter);

/** @brief Cette fonction renvoie le longueur du terrain passé en parametre
 * @param [in] pterrain
 * @return pterrain->dimY_terrain*/
const int getDimY_terrain (const Terrain* pterrain);

/** @brief Cette procédure permet de changer la longueur du terrain passé en parametre par dimY_ter
 * @param [in,out] pterrain
 * @param [in] dimY_ter*/
void setDimY_terrain (Terrain* pterrain, const int dimY_ter);

/** @brief Cette fonction renvoie si le terrain passé en parametre est un terrain bonus ou non
 * @param [in] pterrain
 * @return pterrain->est_bonus_terrain*/
const int getEstBonus (const Terrain* pterrain);

/** @brief Cette procédure permet de changer si le terrain  passé en parametre est un terrain bonus ou non par est_bonus_ter
 * @param [in,out] pterrain
 * @param [in] est_bonus_ter*/
void setEstBonus (Terrain* pterrain, const int est_bonus_ter);

/** @brief Cette fonction renvoie le un entier representant le cout du terrain passé en parametre
 * @param [in] pterrain
 * @return pterrain->cout_terrain*/
const int getCoutTerrain (const Terrain* pterrain);

/** @brief Cette procédure permet de changer le cout du terrain passé en parametre par cout_ter
 * @param [in,out] pterrain
 * @param [in] cout_ter*/
void setCoutTerrain (Terrain* pterrain, const int cout_ter);

#endif
